package com.anda.account.infrastructure.persistence.generic;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.persistence.Entity;

/**
 * 抽象BaseDao实现
 * 
 * @author huan
 * @time 2011-3-12 下午06:57:07
 */
public class BaseDaoImpl<T> extends HibernateDaoSupportBean implements
		BaseDao<T> {

	/**
	 * 得到子类的实体对象
	 */
	protected Class<T> entityClass = getEntityClass();

	@SuppressWarnings("unchecked")
	private Class<T> getEntityClass() {
		// 得到运行期的类的父类
		Type parentType = getClass().getGenericSuperclass();
		// 判断该类是不是泛型
		if (parentType instanceof ParameterizedType) {
			ParameterizedType pType = (ParameterizedType) parentType;
			// 得到泛型中的参数
			return (Class<T>) pType.getActualTypeArguments()[0];
		}
		return null;
	}

	/**
	 * 得到实体的名称
	 * 
	 * @return
	 */
	private String getEntityName() {
		String entityName = entityClass.getSimpleName();
		Entity entity = entityClass.getAnnotation(Entity.class);
		if (entity.name() != null && entity.name() != "") {
			entityName = entity.name();
		}
		return entityName;
	}

	public T saveOrUpdate(T t) {
		getHibernateTemplate().saveOrUpdate(t);
		return t;
	}

	public void delete(T t) {
		getHibernateTemplate().delete(t);
	}

	// 把load换成了get
	public T selectById(Serializable entityId) {
		T t = getHibernateTemplate().get(entityClass, entityId);
		return t;
	}

}